#include <iostream>
#include <string>
#include <functional>
#include <vector>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>

void no_hander(int sig)
{
    std::cout<<"成功捕获到二号信号"<<std::endl;
}

void PringfPending(const sigset_t pend)
{
    std::cout<<"curr pending list["<<getpid()<<"]:";
    for(int signo=31;signo>0;signo--)
    {
       if(sigismember(&pend,signo))
       {
        std::cout<<"1";
       }
       else
       {
        std::cout<<"0";
       }
    }
    std::cout<<std::endl;
}

int main()
{
    //捕获并忽略ctrl+c/2号信号
    //::signal(2,SIG_IGN);
    ::signal(2,no_hander);

    sigset_t block,oblock;
    //两个信号集必须进行初始化,不能使用未知的
    sigemptyset(&block);
    sigemptyset(&oblock);

    //添加2号信号到sig中
    //此时只是用户栈设置,还没有设置到内核中
    sigaddset(&block,2);
    //将二号信号设置到内核中
    sigprocmask(SIG_SETMASK,&block,&oblock);
    int cnt=0;
    while(true)
    {
        sigset_t pending;
        sigpending(&pending);
        PringfPending(pending);

        cnt++;
        sleep(1);

        //解除对二号信号的屏蔽
        if(cnt==10)
        {
            std::cout<<"解除对二号信号的屏蔽"<<std::endl;
            sigprocmask(SIG_SETMASK,&oblock,nullptr);
        }
    }


    return 0;
}